/*
柠檬水找零
class Solution {
    public boolean lemonadeChange(int[] bills) {
        // 定义 5 和 10 的数量
        int five = 0, ten = 0;
        for (int i = 0; i < bills.length; i++) {
            if (i == 0 && bills[i] > 5) {
                return false;
            }
            // 是面额为5的话 不用找钱直接加
            if (bills[i] == 5) {
                five++;
            } else if (bills[i] == 10) {
                // 如果是10的话 判断是否还有5
                if (five != 0) {
                    ten++;
                    five--;
                } else {
                    return false;
                }
            } else {
                // 如果是20的话
                // 判断是否存在10 和 5 则优先减去大额度 10 再减去小额度5
                //贪心
                if (ten != 0 && five != 0) {
                    ten--;
                    five--;
                } else if (five >= 3) {
                    five -= 3;
                } else {
                    return false;
                }
            }
        }
        return true;
    }
}
将数组和减半的最少操作次数
class Solution {
    public int halveArray(int[] nums) {
        PriorityQueue<Double> maxHeap = new PriorityQueue<Double>((v1,v2)-> v2.compareTo(v1));
        //记录总和
        double sum = 0;
        for(int x : nums) {
            //将所有元素存进大根堆 堆顶为最大的元素
            maxHeap.offer((double)x);
            sum+=x;
        }
        //执行次数
        int count = 0;
        double sum2 = sum/2;
        while(sum > sum2) {
            //从堆顶取最大元素 并且/2
            double max = maxHeap.poll();
            sum = sum - max/2;
            count++;
            maxHeap.offer(max/2);
        }
        return count;
    }
}


括号生成
class Solution {
    List<String> ret ;
    StringBuffer path ;
    int left, right, n;
    public List<String> generateParenthesis(int _n) {
        n = _n;
        left = 0; right = 0;
        ret = new ArrayList<>();
        path = new StringBuffer();
        dfs();
        return ret;
    }
    public void dfs() {
        //递归出口 此时右括号全部完成
        if(right == n) {
            ret.add(path.toString());
            return;
        }
        //1.左括号小于n
        if(left < n) {
            path.append("(");left++;
            dfs();
            path.deleteCharAt(path.length()-1);left--;

        }
        //2.右括号一定要小于左括号
        if(right < left) {
            path.append(")");right++;
            dfs();
            path.deleteCharAt(path.length()-1);right--;
        }

    }
}
最大数
class Solution {
    public String largestNumber(int[] nums) {
        String[] arr = new String[nums.length];
        //存入字符数组 更好处理
        for(int i = 0 ;i < nums.length;i++) {
            arr[i] = String.valueOf(nums[i]);
        }
        //重写排序 按 ab>ba  a 在前 b 在后的规则排序
        // ba > ab b在前 a 在后
        Arrays.sort(arr,(x,y) -> (y+x).compareTo(x+y));
        if(arr[0].charAt(0) == '0') {
            return "0";
        }
        //
        StringBuffer ret = new StringBuffer();
        for(String x :arr) {
            ret.append(x);
        }
        return ret.toString();
    }
}
 */